package com.wjw.java.thread;

//实现线程的方式一：继承Thread类
public class MyThread {

    /**
     * 执行main()时的步骤：
     * 1.Java进程开启main线程
     * 2.cat.start(),会开启一个线程类
     * 3.运行main(),然后在Terminal控制台输入：jconsole连接后查看线程的情况
     * 4.main线程60秒后执行完毕了,main线程退出
     * 子线程cat执行80秒才完毕,子线程退出
     *  main线程退出并不能代表子线程也得退出,main线程只是触发子线程的启动
     */
    public static void main(String[] args) {
        //启动子线程
        Cat cat = new Cat();
        /**
         * start()方法底层:
         * 会调用Thread类中的start(){
         *     start0();//调用的是本地方法start0
         * }
         *
         * 本地方法start0是用C/C++实现的,由JVM调用
         * private native void start0();
         *
         * 调用start0()后,该线程并不会立马执行,只是将线程变成了可运行状态,
         * 具体什么时候执行,看CPU,由CPU统一调度
         */
        cat.start();//启动线程,最终会执行cat中的run()
        //不能直接调用run(),直接调用就没有启动子线程,相当于main线程执行一个普通方法
        //此时是串行执行,代码会阻塞,等run方法中的代码执行完毕,才会往下执行代码
        //cat.run();

        //当main线程启动一个子线程cat时,主线程不会阻塞,会继续往下执行代码,此时是并行执行
        String mianThreadName = Thread.currentThread().getName();
        for (int i = 0; i < 60; i++) {
            System.out.println("主线程："+mianThreadName+"执行第"+(i+1)+"次...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
/**
 * 1.当一个类继承了Thread类,该类就是一个线程类,可以当线程使用。
 * 2.重写run方法,写上自己的业务逻辑
 * 3.run方法来自Thread类中的run(),Thread类实现了Runnable接口,重写的run()
 *  @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
 */
class Cat extends Thread{

    int times = 0;//记录循环次数

    @Override
    public void run() {
        //获取线程的名称
        String threadName = Thread.currentThread().getName();
        while (true){
            System.out.println("线程:"+threadName+"我是一只小猫咪..." + (++times));
            //ctrl+alt+t是try...catch的快捷键
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if(times == 80){//结束循环
                break;
            }
        }//while
    }
}
